\appendix
\addappheadtotoc
\appendixpage
\section{Debugging y Testing}
\label{sec:debug}

\subsection{Deteccion de errores}
Claramente uno de los problemas mas grandes que se nos present'o durante el desarrollo de este trabajo pr'actico fue la falta de herramientas auxiliares para detectar errores y testear nuestro c'odigo. Es sabido que son dos las t'ecinas mas utilizadas para detectar errores: debugging y logging. La primera la tenemos cubierta gracias al debugger de bochs, que si bien su entorno no es muy amigable, es muy poderoso pues no solo permite ver todos los registros del procesador, tambi'en interpreta su contenido (para los registros de control, etc) y ademas es capaz de interpretar la estructura de la GDT, paginaci'on, TSS, etc. 

Para hacer logging no tenemos mas que la macro \texttt{IMPRIMIR\_TEXTO} y \texttt{DWORD\_TO\_HEX} provistas por la c'atedra. Si bien son 'utiles para las partes que tenemos escritas en assembler, no es posible utilizarlas desde nuestro c'odigo en C. Es por eso que nos creamos dos funciones en C (archivo debug.c): \texttt{logText},  y \texttt{logVal}. La primera imprime en pantalla byte a byte el puntero a \texttt{char} pasado como par'ametro. La segunda funci'on convierte el valor pasado como parametro a un string que representa al n'umero en formato sin signo usando el segundo par'ametro como base de la conversion\footnote{por lo que facilmente se puede imprimir en base 10 o 16}, y lo imprime en pantalla. 

Ambas utilizan la misma variable global que inicialmente apunta a la primera posici'on de la memoria de video y luego de la impresi'on incrementan en una linea el contador. De esta manera podemos llamarlas sucesivas veces e iran imprimiendo una linea debajo de la otra. Es importante aclarar que estas funciones no realizan ningun checkeo, por lo que vamos a poder usarla solo unas 25 veces consecutivas antes de que la funci'on empiece a escribir fuera de la memoria de video.

\subsection{Probando funcionalidades}
Otro set de funciones que nos pareci'o pertinente tener fue el que pueda testear las distintas funcionalidades de nuestro c'odigo (testing.c). Especialmente para la parte de nuestro c'odigo que maneja las excepciones y administraci'on de memoria, pues estas nos brindan los servicios que luego vamos a utilizar cuando lancemos las tareas.

Las funciones que creamos para testear las excepciones son las siguientes: 

\begin{itemize}
\item[a)] \texttt{generar\_db}: genera una excepcion de division por cero.
\item[b)] \texttt{generar\_gp}: genera una excepcion de proteccion general accediendo a una posicion fuera del segmento de video (es).
\item[c)] \texttt{make\_calls}: hace n (par'ametro) llamados recursivos antes de llamar a la funci'on pasada como par'ametro.
\end{itemize}

Si bien las programamos en C, las primeras dos tuvimos que usar assembler embebido, pues de otra manera el compilador en C no nos dejaba generar el ejecutable. Esto 'ultimo se debe a los flags usados en el Makefile para generar el TP. 

La tercera funci'on fue interesante implementarla, pues tuvimos que definir un tipo de datos puntero a funcion\footnote{tecnicamente es un puntero a funci'on que devuelve void y no toma parametros} para poder pasarle como par'ametro las otras dos funciones creadas. Esta 'ultima funci'on nos sirve para testear el c'odigo que genera el backtrace cuando se produce una excepci'on.

Para testear la paginaci'on solo creamos la funci'on \texttt{recorrer\_dir} que, valga la redundancia, recorre toda el rango de direcciones pasadas como par'ametro realizando una lectura y escritura (a si misma). De esta manera podemos ver si armamos bien los mapas de memoria y si la funci'on para mapear y desmapear cumplian bien su objetivo.

En el archivo kernel.asm podemos ver comentado en cada ejercicio el c'odigo pertinente para realizar los chekeos utilizando las funciones reci'en descriptas.